// cached_network_image
import 'package:abc/view/error_view_widget.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';

// 导出
export 'package:cached_network_image/cached_network_image.dart';

/* 基础image组件
* 1. 支持本地图片加载
* 2. 支持网络图片加载和网络缓存, 因为要加载展位图, 不指定宽高, 会默认拿外层容器宽度
*    如果外层容器无宽高限制, 需指定宽高, 否则展位图不显示
* */
class NetLoadImg extends StatelessWidget {
  const NetLoadImg(
      this.src, {
        super.key,
        this.width,
        this.height,
        this.fit, // 展现方式
        this.onPressed, // 回调
        this.errorSrc, //设置图片加载失败预设图片
        this.placeholderSrc, //预加载的默认本地展位图
        this.opacity, // 透明度
        this.query = 'w=10&q=80', // 图片配置
        this.showLoading = false,
        this.color,
        this.downloadProgress,
        this.type,
        this.errorWidget, // 自定义错误Widget
      });

  final void Function(String, DownloadProgress)? downloadProgress;
  final bool showLoading;
  final String src; // 图片地址
  final double? width; // 图片宽度 double
  final double? height; // 图片高度 double
  final BoxFit? fit;
  final VoidCallback? onPressed;
  final String? errorSrc;
  final String? placeholderSrc;
  final double? opacity;
  final String query;
  final Color? color;
  final String? type;
  final Widget? errorWidget; // 自定义错误Widget

  String getOssSrc(String src) {
    return src;
    // return '${request.baseUrl}/api/oss/${JhEncryptUtils.aesEncryptImage(src)}/${JhEncryptUtils.aesEncryptImage(query)}';
  }

  Widget renderContent() {
    // 检查图片路径是否有效
    if (src.isEmpty) {
      if (errorWidget != null) {
        return errorWidget!;
      }
      return _errorImage();
    }

    // 如果是网络图片
    if (src.startsWith('http') || src.startsWith('https')) {
      return CachedNetworkImage(
          imageUrl: src,
          width: width,
          height: height,
          fit: fit,
          // httpHeaders: {
          //   'User-Agent': 'Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36',
          //   'Accept': 'image/webp,image/apng,image/*,*/*;q=0.8',
          //   'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
          //   // 'Cache-Control': 'no-cache',
          // },
          progressIndicatorBuilder: (context, url, progress) {
            if (downloadProgress != null) {
              downloadProgress!(url, progress);
            }

            if (placeholderSrc == null || placeholderSrc!.isEmpty == true) {
              return _defaultImage();
            }
            return Image.asset(
              placeholderSrc!,
              fit: BoxFit.contain,
              color: color,
            );
          },
          errorWidget: (context, url, error) {
            // print('NetLoadImg: 网络图片加载失败 - URL: $url, 错误: $error');

            // 如果是401认证错误，尝试使用默认图片
            if (error.toString().contains('401') ||
                error.toString().contains('unauthorized')) {
              print('NetLoadImg: 检测到401认证错误，使用默认图片');
              return _errorImage();
            }

            if (errorWidget != null) {
              return errorWidget!;
            }
            if (errorSrc == null || errorSrc!.isEmpty) {
              return _errorImage();
            }
            return Image.asset(
              errorSrc!,
              fit: BoxFit.contain,
            );
          });
    }

    // 检查是否是有效的本地资源路径
    if (_isValidAssetPath(src)) {
      // 如果是本地图片
      return Image.asset(
        src,
        width: width,
        height: height,
        fit: fit,
        color: color,
        opacity: opacity is double ? AlwaysStoppedAnimation(opacity!) : null,
        gaplessPlayback: true,
        errorBuilder: (context, error, stackTrace) {
          print('NetLoadImg: 本地图片加载失败 - 路径: $src, 错误: $error');
          if (errorWidget != null) {
            return errorWidget!;
          }
          if (errorSrc == null || errorSrc!.isEmpty) {
            return _errorImage();
          }
          return Image.asset(
            errorSrc!,
            fit: BoxFit.contain,
          );
        },
      );
    } else {
      // 无效的图片路径，可能是服务器返回的base64或其他格式
      // print('NetLoadImg: 无效的图片路径 - $src');
      if (errorWidget != null) {
        return errorWidget!;
      }
      return _defaultImage();
    }
  }

  /// 检查是否是有效的本地资源路径
  bool _isValidAssetPath(String path) {
    // 检查是否以 assets/ 开头
    if (path.startsWith('assets/')) {
      return true;
    }

    // 检查是否包含 base64 编码的特征（通常很长且包含特殊字符）
    if (path.length > 100 && path.contains('=')) {
      return false;
    }

    // 检查是否包含服务器路径特征
    if (path.startsWith('/liuyun/') || path.startsWith('/api/')) {
      return false;
    }

    return true;
  }

  Widget _defaultImage() {
    return Image.asset(
      'assets/images/default.png',
      fit: BoxFit.cover,
    );
  }

  Widget _errorImage() {
    // 根据容器尺寸调整错误视图
    double errorHeight = height ?? 200;
    if (height != null && height! < 50) {
      // 如果容器很小，使用简化版本
      return ErrorViewPresets.simple(
        width: width,
        height: height!,
        iconSize: height! * 0.6, // 图标占容器高度的60%
        borderRadius: 4,
      );
    }
    
    return ErrorViewPresets.imageError(
      width: width,
      height: errorHeight,
      borderRadius: 8,
    );
  }

  DecorationImage _decorationImage() {
    return DecorationImage(
      image: AssetImage(
        (placeholderSrc?.isNotEmpty == true)
            ? placeholderSrc!
            : 'assets/images/default.png',
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    if (onPressed is Function) {
      return InkWell(
        onTap: onPressed,
        child: renderContent(),
      );
    }
    return renderContent();
  }
}
